using Cysharp.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;

// 如果想注册事件 要使用异步的lambada 如: actEvent += async () => { }; 不可使用 async void
// 可以使用UniTask.Action 或 UniTask.UnityAction   通过async UniTaskVoid lambda 创建委托
//举例     //UniTask.Action(
// async () =>
//  {
//     Debug.Log("aa");
//     await UniTask.Delay(1000);
// }
//  );


// 按钮点击事件转换为异步的 OnClickAsync() 其他UI组件类似
//UniTask 提供的 GetCancellationTokenOnDestroy()
public class Twelve : MonoBehaviour
{
    public Button btn;

    private void Start()
    {
        btn.onClick.AddListener(() =>
        {
            // Debug.Log("点击:" + Time.time);
            ClickN().Forget();
        });
        // ClickN().Forget();
        ClickNA(this.GetCancellationTokenOnDestroy()).Forget();
    }


    public async UniTaskVoid ClickN()
    {
        Debug.Log("0");
        await btn.OnClickAsync();
        Debug.Log("1");
    }

    public async UniTaskVoid ClickNA(CancellationToken token)
    {
        while (true)
        {
            Debug.Log("点击:" + Time.time);
            var click = btn.OnClickAsync(token);

            // 等待点击事件完成
            // token 是通过 GetCancellationTokenOnDestroy 获取
            //新的token 用于取消以前的任务  ??????
            await click;
            Debug.Log("点击:" + Time.time);
        }
    }
}